2-12 找出流感的規律
飛哥打開電腦,用熟悉的R程式分析了手上的資料,一邊盯著螢幕思考著。
「飛哥,你之前不是都用Python嗎?怎麼這次用R進行分析了啊?」小博有些疑惑,畢竟平常看飛哥用Python用得風生水起,一時換了方法還挺意外的。
飛哥搔了搔腦袋說道:「因為時間序列這個方法在統計上已經被使用很久了,而R語言又是統計分析時常用的軟體,因此時間序列的相關套件也被寫得很完善;Python是近幾年來的當紅程式語言,主要是因機器學習與深度學習的興起有關,時間序列的套件就相對的比較少。所以說我做時間序列時,反而比較常用R語言呢!」。
「不提這個了,你看螢幕,我們做時間序列分析時,第一步是 看序列是否平穩 ,如果不平穩,就會利用『差分(由後一項數字減去前一項數字)』來平緩遞增遞減的趨勢,以維持數列的穩定性,像疾管署給的這筆資料很平穩,我就不打算進行差分了。」飛哥指著電腦螢幕說著。
「這邊用Augmented Dickey–Fuller Test,虛無假設是『該序列有單根』,可以想像序列經線性回歸後,若跟x軸相切則表示有單根;也就是說若P-value< 0.05,則回歸後的預測線是與x軸水平,間接表示這個序列是平穩的,不會有遞增向上或向下的趨勢出現。」飛哥詳細的介紹簡單的平穩性測試方法。
「再來就是很多人看不懂的 ACF 和 PACF 圖形啦!這兩個是用來檢測資料自身的相關性,分別是 自我相關係數 與 偏自我相關係數 。」飛哥指著這些一條條突起的線。
並接著解釋說:「左邊的ACF圖中線的高低代表的是 資料經過t個時間平移後,未平移資料與平移資料的相關係數,所以看到第一條線t=0(未平移)時相關係數一定等於1,因為平移0次的資料長的跟原始資料一模一樣;右邊PACF圖中從左邊數來第t個值代表的是 排除掉第1到第t-1秒對原始資料造成的影響後,剩餘第t秒與原始資料的相關係數 ,因此這指標看的是單一秒數對原始資料的相關程度高低。所以說就上述定義而言,ACF與PACF在第1秒的數值一定相同,都是在算平移1秒後資料與原資料的相關係數。」
「好神奇喔!我以為相關係數只能計算不同個體間的數值,沒想到還可以自己跟自己比。」小博聽完飛哥的解說後嘖嘖稱奇。
「就是因為資料有 重現性 ,所以經過一定時間後,狀態會再重現,在這個時間點,自己跟t秒前的自己是很相似的,所以相關係數也會高,也就符合資料具有自相關的這個特徵了。」飛哥耐心的說明著,畢竟第一次認識這個指標的人多半聽不太懂。
「待會再跟你說說時間序列模型怎麼建吧!我先去喝杯茶。」說完,飛哥拿起櫃子上他最愛的菊花與普洱茶包。
R程式時間
#建立資料
x=c(154,123,79,87,63,54,32,13,28,69,86,75,
112,100,89,82,76,56,48,21,22,38,73,85,
139,130,93,90,73,60,44,21,26,47,59,69,
132,110,99,72,74,52,43,28,29,48,63,75,
135,120,93,90,66,67,47,31,25,47,69,59)
year=c('2015','2016','2017','2018','2019')
month=c('01','02','03','04','05','06','07','08','09','10','11','12')
k=c('') #設定資料串時間
for (i in c(1:length(year))){
for (j in c(1:length(month))){
data=paste(year[i], month[j], sep="-")
k=c(k,data)}}
k=k[-1]
k
plot.ts(x) #畫出時序圖
influenza_people <- ts(x, frequency=12, start=c(2015,1))
plot.ts(influenza_people) #畫出時序圖+時間
acf(x, lag.max=30) #自我相關
pacf(x, lag.max=30) #偏自我相關
install.packages("tseries") #安裝套件
library(tseries)
adf.test(x) #檢測平穩性
後記:檢測平穩性的方法不只一種,這邊提飛哥最常用的一種,第一次接觸時間序列的時候也是想了很久啊,後來接觸許多專案才慢慢搞懂它的操作原理。
資料參考:
http://finzi.psych.upenn.edu/R/library/tseries/html/adf.test.html
https://a-little-book-of-r-for-time-series.readthedocs.io/en/latest/src/timeseries.html
https://online.stat.psu.edu/stat510/lesson/2/2.2